package com.hzqy.service.hqjc;

import com.hzqy.commons.utils.DateUtil;
import com.hzqy.commons.utils.PublicUtil;
import com.hzqy.persistence.dao.hqjc.PayDao;
import com.hzqy.service.core.GenericServiceBean;
import com.hzqy.web.vo.PmsUserVo;
import com.hzqy.web.vo.SysProductVo;
import com.hzqy.web.vo.UserBillVo;
import com.hzqy.web.vo.WchatOrderVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;

@Service
public class PayServiceBean extends GenericServiceBean<PmsUserVo,PayDao, Integer>{
	private static final long serialVersionUID = 1L;
	protected final Logger LOG = LoggerFactory.getLogger(getClass());
	
	@Resource
	private PayDao payDao;

	@Override
	public PayDao getEntityDao() {
		return payDao;
	}
	
	public SysProductVo selectProduct(int f_sp_id) {
		return payDao.selectProduct(f_sp_id);
	}
	
	/**
	 * 同步信息入库
	 * @param userBillVo
	 * @return
	 */
	public int insertUserBill(UserBillVo userBillVo) {
		int flag = -1;
		int type = userBillVo.getF_ub_type(); //先获取服务传来的定购类型，0定购，1退定，防止在134行代码执行覆盖
		String f_sp_productcode = userBillVo.getF_sp_productcode();
		SysProductVo productVo = payDao.selectProductByCode(f_sp_productcode);
		if(productVo!=null) {
			userBillVo.setF_ub_productid(productVo.getF_sp_id());
			userBillVo.setF_ub_fee(productVo.getF_sp_fee()+"");
			userBillVo.setF_ub_info(productVo.getF_sp_name());
			userBillVo.setF_ub_type(productVo.getF_sp_type());
		} else {
			userBillVo.setF_ub_productid(0);
			userBillVo.setF_ub_fee(0+"");
			userBillVo.setF_ub_info(f_sp_productcode);
			userBillVo.setF_ub_type(type);
			LOG.error("未找到服务栏目传来的产品ID:"+f_sp_productcode+"，请赶紧在后台配置，对应表sys_product。");
		}
		
		if(type==0) {
			flag = subUserBill(userBillVo);
		} else if(type==1) {
			flag = unsubUserBill(userBillVo);
		} else {
			LOG.error("服务回调VASBack类型未知type="+type);
		}
		return flag;
	}
	
	private int subUserBill(UserBillVo userBillVo) {
		int flag=0;
		try {
			UserBillVo	billVo=payDao.selectCurUserBill(userBillVo);
			if(billVo!=null&&billVo.getF_ub_unsubtime().trim().length()==0&&userBillVo.getF_ub_ordertime().substring(0,10).equals(billVo.getF_ub_ordertime().substring(0,10))){
				LOG.debug(billVo.getF_ub_serverid()+"用户已订购过产品ID为"+billVo.getF_ub_productid());
			}else{
				userBillVo.setF_ub_ordertime(PublicUtil.getCurDateTime());
				userBillVo.setF_ub_unsubtime("");
				flag= payDao.insertUserBill(userBillVo);
				if(flag == 1){
					LOG.debug(userBillVo.getF_ub_serverid()+"用户插入产品ID"+userBillVo.getF_ub_productid()+"订购数据成功！");
				}else{
					LOG.debug(userBillVo.getF_ub_serverid()+"用户插入产品ID"+userBillVo.getF_ub_productid()+"订购数据失败！");
				}
			}	
				return flag;
		} catch (Exception e) {
			LOG.error("服务返回的定购数据入库异常",e);
			return flag;
		}
	}
	
	private int unsubUserBill(UserBillVo userBillVo) {
		int flag=0;
		try {
			UserBillVo billVo = payDao.selectCurUserBill(userBillVo);
			if(billVo != null){
				if(billVo.getF_ub_unsubtime()!=null && billVo.getF_ub_unsubtime().trim().length()>0){
					LOG.debug(userBillVo.getF_ub_serverid()+"用户已存在产品ID"+userBillVo.getF_ub_productid()+"的退订数据！");
				}else{
					String endtime = userBillVo.getF_ub_endtime();
					if(endtime == null || endtime.trim().length()<=0){
						endtime = PublicUtil.getDateString(DateUtil.getMonthLastDate(new Date()), "yyyy-MM-dd hh:mm:ss") ;
					}
					billVo.setF_ub_endtime(endtime);
					billVo.setF_ub_unsubtime(PublicUtil.getCurDateTime());
					billVo.setF_ub_type(3);
					flag = payDao.insertUnsubBill(billVo);
					if(flag == 1){
						LOG.debug(userBillVo.getF_ub_serverid()+"-用户插入产品ID："+userBillVo.getF_ub_productid()+"-退订数据成功！");
					}else{
						LOG.debug(userBillVo.getF_ub_serverid()+"-用户插入产品ID："+userBillVo.getF_ub_productid()+"-退订数据失败！");
					}
				}
			}else{
				String endtime = userBillVo.getF_ub_endtime();
				if(endtime == null || endtime.trim().length()<=0){
					endtime = PublicUtil.getDateString(DateUtil.getMonthLastDate(new Date()), "yyyy-MM-dd hh:mm:ss") ;
				}
				userBillVo.setF_ub_endtime(endtime);
				userBillVo.setF_ub_unsubtime(PublicUtil.getCurDateTime());
				userBillVo.setF_ub_type(3);
				flag = payDao.insertUserBill(userBillVo);
				if(flag == 1){
					LOG.debug(userBillVo.getF_ub_serverid()+"用户新插入产品ID"+userBillVo.getF_ub_productid()+"退订数据成功！");
				}else{
					LOG.debug(userBillVo.getF_ub_serverid()+"用户新插入产品ID"+userBillVo.getF_ub_productid()+"退订数据失败！");
				}
				//LOG.error("不存在"+userBillVo.getF_ub_serverid()+"订购产品ID"+userBillVo.getF_ub_productid()+"记录!");
			}
			return flag;
			
		} catch (Exception e) {
			LOG.error("服务返回的退定数据入库异常",e);
			return flag;
		}
	}
	
	/**
	 * 订购信息入库
	 * @param userBillVo
	 * @return
	 */
	public int insertOrderUserBill(UserBillVo userBillVo) {
		int flag = -1;
		int type = userBillVo.getF_ub_type(); //先获取服务传来的定购类型，0定购，1退定，防止在134行代码执行覆盖
		String f_sp_productcode = userBillVo.getF_sp_productcode();
		SysProductVo productVo = payDao.selectProductByCode(f_sp_productcode);
		if(productVo!=null) {
			userBillVo.setF_ub_productid(productVo.getF_sp_id());
			userBillVo.setF_ub_fee(productVo.getF_sp_fee()+"");
			userBillVo.setF_ub_info(productVo.getF_sp_name());
			userBillVo.setF_ub_type(productVo.getF_sp_type());
		} else {
			LOG.error("Order未找到服务栏目传来的产品ID:"+f_sp_productcode+"，请赶紧在后台配置，对应表sys_product。");
		}
		
		if(type==0) {
			flag = subOrderUserBill(userBillVo);
		}else if(type==1) {
			flag = unsubUserBill(userBillVo);
		}else {
			LOG.error("Order服务回调VASBack类型未知type="+type);
		}
		return flag;
	}
	
	private int subOrderUserBill(UserBillVo userBillVo) {
		int flag=0;
		try {
			UserBillVo	billVo=payDao.selectCurUserBill(userBillVo);
			if(billVo!=null&&billVo.getF_ub_unsubtime().trim().length()==0){
				flag= payDao.updateUserBill(userBillVo);
				if(flag == 1){
					LOG.debug(userBillVo.getF_ub_serverid()+"用户修改Order产品ID"+userBillVo.getF_ub_productid()+"订购数据成功！");
				}else{
					LOG.debug(userBillVo.getF_ub_serverid()+"用户修改Order产品ID"+userBillVo.getF_ub_productid()+"订购数据失败！");
				}
			}else{
				userBillVo.setF_ub_ordertime(PublicUtil.getCurDateTime());
				userBillVo.setF_ub_unsubtime("");
				flag= payDao.insertUserBill(userBillVo);
				if(flag == 1){
					LOG.debug(userBillVo.getF_ub_serverid()+"用户插入Order产品ID"+userBillVo.getF_ub_productid()+"订购数据成功！");
				}else{
					LOG.debug(userBillVo.getF_ub_serverid()+"用户插入Order产品ID"+userBillVo.getF_ub_productid()+"订购数据失败！");
				}
			}	
				return flag;
		} catch (Exception e) {
			LOG.error("服务返回的定购数据入库异常",e);
			return flag;
		}
	}
	
	/**
	 * 同步信息入库
	 * @param userBillVo
	 * @return
	 */
	public int insertUserBillForWeekFree(UserBillVo userBillVo) {
		int flag = -1;
		int type = userBillVo.getF_ub_type(); //先获取服务传来的定购类型，0定购，1退定，防止在134行代码执行覆盖
		String f_sp_productcode = userBillVo.getF_sp_productcode();
		SysProductVo productVo = payDao.selectProductByCode(f_sp_productcode);
		if(productVo!=null) {
			userBillVo.setF_ub_productid(productVo.getF_sp_id());
			userBillVo.setF_ub_fee(productVo.getF_sp_fee()+"");
			userBillVo.setF_ub_info(productVo.getF_sp_name());
			userBillVo.setF_ub_type(productVo.getF_sp_type());
		} else {
			userBillVo.setF_ub_productid(0);
			userBillVo.setF_ub_fee(0+"");
			userBillVo.setF_ub_info(f_sp_productcode);
			userBillVo.setF_ub_type(type);
			LOG.error("未找到服务栏目传来的产品ID:"+f_sp_productcode+"，请赶紧在后台配置，对应表sys_product。");
		}
		
		flag = payDao.insertUserBill(userBillVo);
		
		return flag;
	}
	
	public String getWeekFreeResult(String f_ub_serverid,int f_ub_productid){
		String result = "504";
		UserBillVo userBillVo = new UserBillVo();
		userBillVo.setF_ub_serverid(f_ub_serverid);
		userBillVo.setF_ub_productid(f_ub_productid);
		userBillVo = payDao.selectCurUserBill(userBillVo);
		if(userBillVo == null){
			result = "504";
		}else{
			//weekFreeVo 信息不为空，判断当前时间是否在有效时间范围内
			Date date = new Date();//当前时间
			try {
				//有效开始时间
				Date starttime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(userBillVo.getF_ub_unsubtime());
				//有效结束时间
				Date endtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(userBillVo.getF_ub_endtime());
				if(starttime.getTime() <= date.getTime() && date.getTime() <= endtime.getTime()){
					result = "0";
				}
			} catch (Exception e) {
				LOG.error("时间信息格式化错误：",e);
				result = "0";
			}
		}
		return result;
	}
	
	public UserBillVo selectUserBill(UserBillVo userBillVo){
		return payDao.selectCurUserBill(userBillVo);
	}
	
	public int insertUserBillDB(UserBillVo userBillVo){
		return payDao.insertUserBill(userBillVo);
	}
	
	public WchatOrderVo selectWxOrder(WchatOrderVo wchatOrderVo){
		return payDao.selectWxOrder(wchatOrderVo);
	}
}
